SUB    SP, SP, #0x10   				  ;分配栈控件16个字节

;下面是先存储参数，然后取出来用
STR             W0, [SP,#0x10+var_4]  ;把W0入栈，即a
STR             W1, [SP,#0x10+var_8]  ;把W1入栈，即b
LDR             W0, [SP,#0x10+var_4]  ;出栈a，存储到W0
LDR             W1, [SP,#0x10+var_8]  ;出栈b，存储到W1

;主代码到了，求和
ADD             W0, W0, W1            ;求和，并把和存储到W0，相当于int c = a + b;

;返回值处理
STR             W0, [SP,#0x10+var_C]  ;把和W0入栈
LDR             W0, [SP,#0x10+var_C]  ;把和W0出栈，现在W0存储的就是结果了。
ADD             SP, SP, #0x10         ;平栈，采用平栈方式是add
RET									  ;子程序结束


add x0,x0,#1            ;x0 <==x0+1 ,把x0的内容加1。
add x0,x0,#0x30         ;x0 <==x0+0x30,把x0的内容加 0x30。
add x0,x1,x3            ;x0 <==x1+x3, 把x1的内容加上x3的内容放入x0
add x0,x1,x3,lsl #3     ;x0 <==x0+x3*8 ,x3的值左移3位就是乘以8，结果与x1的值相, 放入x0.
add x0,x1,[x2]          ;x0 <==x1+[x2], 把x1的内容加上x2的内容作为地址取内存内容放入x0
ldr x0,[x1]             ;x0 <==[x1], 把x1的内容作为地址取内存内容放入x0
str x0,[x1]             ;[x1] <== x0, 把x0的内容放入x1的内容作为地址的内存中
ldr x0,[x1,#4]          ;x0 <==[x1+4], 把x1的内容加上4, 作为内存地址, 取其内容放入x0
ldr x0,[x1,#4]!         ;x0 <==[x1+4]、 x1<==x1+4, 把x1的内容加上4, 作为内存地址, 取其内容放入x0, 然后把x1的内容加上4放入x1
ldr x0,[x1],#4          ;x0 <==[x1] 、x1 <==x1+4, 把x1的内容作为内存地址取内存内容放入x0, 并把x1的内容加上4放入x1
ldr x0,[x1,x2]          ;x0 <==[x1+x2], 把x1和x2的内容相加, 作为内存地址取内存内容放入x0


Arm64`main:
    0x100026c24 <+0>:  sub    sp, sp, #0x30             ; =0x30 ;编译器计算到此次方法调用要48bit的栈,把栈底减48bit留出空位存临时变量
    0x100026c28 <+4>:  stp    x29, x30, [sp, #0x20] ;将fp和lr存入栈的sp+32的地址
    0x100026c2c <+8>:  add    x29, sp, #0x20            ; =0x20 ;sp+32后存入x29，fp此时的位置就是sp+32
    0x100026c30 <+12>: mov    w8, #0xa ;将10存到寄存器w8
    0x100026c34 <+16>: orr    w9, wzr, #0x4 ;将4与wzr进行或运算，存到寄存器W9
    0x100026c38 <+20>: stur   w0, [x29, #-0x4] ;把w0(main方法的第一个参数, argc),存入x29减4的位置
    0x100026c3c <+24>: str    x1, [sp, #0x10] ;将x1(main方法的第二个参数*argv[])，存入sp-16的位置
    0x100026c40 <+28>: str    w9, [sp, #0xc] ;将w9的值，存入到sp+12的位置
    0x100026c44 <+32>: str    w8, [sp, #0x8] ;将w8的值，存入到sp+8的位置
    0x100026c48 <+36>: ldr    w0, [sp, #0xc] ;将sp+12地址对应的内容加载到寄存器w0
    0x100026c4c <+40>: ldr    w1, [sp, #0x8] ;将sp+8地址对应的内容加载到寄存器w1
    0x100026c50 <+44>: bl     0x100026c00               ; callMe at main.m:16 ;调用callMe方法,将w0、w1作为参数
->  0x100026c54 <+48>: mov    w8, #0x0 ;将0存到w8
    0x100026c58 <+52>: mov    x0, x8 ;将0存到x0
    0x100026c5c <+56>: ldp    x29, x30, [sp, #0x20] ;从栈里把最开始保存的fp和lr还原回来
    0x100026c60 <+60>: add    sp, sp, #0x30             ; =0x30 ;sp+48后,存到sp(跳到下一个frame的位置)
    0x100026c64 <+64>: ret ;返回

Arm64`callMe:
    0x100026c00 <+0>:  sub    sp, sp, #0x20             ; =0x20 ;编译器计算到此次方法调用要用到32bit的栈，把栈底减32bit留出空位存临时变量
    0x100026c04 <+4>:  stp    x29, x30, [sp, #0x10] ;将fp和lr寄存器存入到sp+16的位置
    0x100026c08 <+8>:  add    x29, sp, #0x10            ; =0x10 ; 将sp+16后，存入到x29
    0x100026c0c <+12>: stur   w0, [x29, #-0x4] ; 将w0（第一个参数）存入到x29 -4的位置
    0x100026c10 <+16>: str    w1, [sp, #0x8] ;将w1(第二个参数) 存入到sp+8的位置
->  0x100026c14 <+20>: bl     0x100026bfc               ; callYou at main.m:14 ; 调用callYou方法
    0x100026c18 <+24>: ldp    x29, x30, [sp, #0x10] ;从栈里把最开始保存的fp和lr还原回来
    0x100026c1c <+28>: add    sp, sp, #0x20             ; =0x20 ;sp+32后，存入到sp(跳到下一个frame的位置)
    0x100026c20 <+32>: ret   

ldr x0, [x1];			// 从`x1`指向的地址里面取出一个 64 位大小的数存入 `x0`
ldp x1, x2, [x10, #0x10];	// 从 x10 + 0x10 指向的地址里面取出 2个 64位的数，分别存入x1, x2
str x5, [sp, #24];		// 把x5的值（64位数值）存到 sp+24 指向的内存地址上
stp x29, x30, [sp, #-16]!;	// 把 x29, x30的值存到 sp-16的地址上，并且把 sp-=16. 
ldp x29, x30, [sp], #16;	// 从sp地址取出 16 byte数据，分别存入x29, x30. 然后 sp+=16;

[x10, #0x10]      // signed offset。 意思是从 x10 + 0x10的地址取值
[sp, #-16]!       // pre-index。  意思是从 sp-16地址取值，取值完后在把 sp-16  writeback 回 sp
[sp], #16         // post-index。 意思是从 sp 地址取值，取值完后在把 sp+16 writeback 回 sp


mov sp, fp;			//  sp 设置为fp, 就是图中 -->fp_B 的位置
ldp fp, lr, [sp], #0x10;	//  从sp指向的地址中读取 2个64位，分别存入fp,lr。 然后将sp += 0x10
				// 这一步执行完之后，fp就执行了图中 -->fp_A. lr恢复成 _funcA的返回地址。 sp指向了 -->sp_A. 
				// 这个时候状态已经完全恢复到了 _funcA 的环境
ret;    // 返回指令，这一步直接执行lr的指令。





